package es.antonio.duarte.abrahamAdmin.struts.exceptionhandler;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.struts.Globals;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionMessage;
import org.apache.struts.action.ActionMessages;
import org.apache.struts.action.ExceptionHandler;
import org.apache.struts.config.ExceptionConfig;

/**
 * Clase encargada de gestionar las excepciones que se produzcan y hacer un
 * tratamiento correcto de ellas. Para más información sobre la gestión de
 * excepciones en AME4J consultar http://ame.endesa.es/confluence
 */
public class BasicExceptionHandler extends ExceptionHandler {

   /** Manejador de la traza. */
   private final Log log = LogFactory.getLog(BasicExceptionHandler.class);

   /** Variable dependendiente del sistema que indica un salto de linea. */
   private final String separador = System.getProperty("line.separator");

   /**
    * Ejecucion del action. Maneja las excepciones generadas.
    * @param excepcionAManejar Excepcion a manejar
    * @param exConfig ExceptionConfig asociado al action
    * @param mapping ActionMapping asociado al action
    * @param form ActionForm asocido al action
    * @param request HttpServletRequest asociado al action
    * @param response HttpServletResponse asociado al action
    * @return ActionForward
    * @throws ServletException En caso de error en la ejecucion del action
    * @see org.apache.struts.action.Action#execute(org.apache.struts.action.ActionMapping,
    *      org.apache.struts.action.ActionForm,
    *      javax.servlet.http.HttpServletRequest,
    *      javax.servlet.http.HttpServletResponse)
    */
   @Override
   public ActionForward execute(Exception excepcionAManejar,
            ExceptionConfig exConfig, ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws ServletException {
      String mensaje = excepcionAManejar.getMessage();
      String nombreExcepcion = excepcionAManejar.getClass().getName();
      // generamos el mensaje de error
      StringBuilder builder = new StringBuilder();
      builder.append(generateId());
      builder
               .append("-ExceptionHandler: Se ha capturado la siguiente excepción: ");
      builder.append(nombreExcepcion);
      log.info(builder);
      builder.append(separador);
      builder.append("Mensaje de la excepción: ");
      builder.append(mensaje);
      builder.append(separador);
      builder.append("Traza de la excepción: ");
      builder.append(excepcionAManejar);
      log.error(builder);
      ActionMessages errores = new ActionMessages();
      ActionMessage error = new ActionMessage("error.mensaje", generateId());
      errores.add("errores", error);
      request.setAttribute(Globals.ERROR_KEY, errores);
      return mapping.findForward("ERROR");

   }

   /**
    * Genera un nuevo id para la excepcion.
    * @return id de la excepcion
    */
   public String generateId() {
      return Long.toString(System.nanoTime());
   }
}
